home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Enigma Amiga CD
/
Listati
/
66-Lug-Ago-DIDATTICA-List1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-02
|
10KB
|
289 lines
/****************************************************************************
* Listato 1 *
* Vi ricordate l'esempio di qualche numero fa di una finestra SuperBitMap *
* con un immagine 1024x1024 che poteva scorrere nella finestra mediante *
* tasti cursore? L'esempio e' stato adattato con l'utilizzo di gadget pro- *
* porzionali per lo spostamento della bitmap *
****************************************************************************/
#define INTUI_V36_NAMES_ONLY
/* inclusione file di supporto */
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <graphics/gfx.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/layers_protos.h>
#include <clib/dos_protos.h>
struct Library *IntuitionBase = NULL; /* puntatore a intuition.library */
struct Library *GfxBase = NULL; /* puntatore a graphics.library */
struct Library *LayersBase = NULL; /* puntatore a layers.library */
struct Screen *pubscreen = NULL; /* puntatore al workbench */
struct Window *finestra = NULL; /* puntatore alla finestra */
struct BitMap *supBitMap = NULL; /* puntatore alla bitmap */
struct MsgPort *UPort; /* puntatore alla porta IDCMP */
/* definizione codici identificatori dei gagdets */
#define ORIZGADGET 0
#define VERTGADGET 1
#define NESSUNGADGET 0xFFFF
/* strutture per i gadgets */
struct Image GadOrizImage, GadVertImage;
struct PropInfo PropVertInfo, PropOrizInfo;
struct Gadget GadVert, GadOriz;
/* definizione prototipi di funzione */
void WaitEvent(struct MsgPort *,struct IntuiMessage *);
void CloseAll(void);
void OpenAll(void);
void InizializzaGadgets(void);
void DisegnaTutto(void);
void NewSize(LONG *, LONG *);
void MoveMap(UWORD, LONG *, LONG *);
UWORD RangeRand(unsigned long MaxValue); /* funzione di Amiga.lib per la generazione di numeri casuali */
void WaitEvent(struct MsgPort *porta,struct IntuiMessage *mess)
{
struct IntuiMessage *msg;
while ((msg = (struct IntuiMessage *)GetMsg(porta)) == NULL)
WaitPort(porta);
CopyMem(msg,mess,sizeof(struct IntuiMessage));
return;
}
/* procedura CloseAll() */
void CloseAll()
{
register ULONG i;
if (finestra != NULL) CloseWindow(finestra);
for (i=0; i<pubscreen->BitMap.Depth; i++)
if (supBitMap->Planes[i] != NULL) FreeRaster(supBitMap->Planes[i],1024,1024);
if (supBitMap != NULL) FreeMem(supBitMap,sizeof(struct BitMap));
if (pubscreen != NULL) UnlockPubScreen(NULL,pubscreen);
if (LayersBase != NULL) CloseLibrary(LayersBase);
if (GfxBase != NULL) CloseLibrary(GfxBase);
if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
exit(0);
}
/* procedura OpenAll() */
void OpenAll()
{
register ULONG i;
/* apriamo intuition.library, almeno version 36 */
if ((IntuitionBase = OpenLibrary("intuition.library",36L)) == NULL)
CloseAll();
/* apriamo graphics.library, almeno version 36; vengono utilizzate delle
funzioni per il disegno */
if ((GfxBase = OpenLibrary("graphics.library",36L)) == NULL)
CloseAll();
/* apriamo layers.library, almeno version 36; necessita per l'utilizzo di una
funzione per lo scrolling del layer della finestra */
if ((LayersBase = OpenLibrary("layers.library",36L)) == NULL)
CloseAll();
/* blocca lo schermo pubblico di default */
if ((pubscreen = LockPubScreen(NULL)) == NULL)
CloseAll();
/* alloca la memoria per la struttura BitMap */
if ((supBitMap = (struct BitMap *)AllocMem(sizeof(struct BitMap),MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
CloseAll();
/* inizializza i campi della BitMap */
InitBitMap(supBitMap,pubscreen->BitMap.Depth,1024,1024);
/* alloca i piani di bit della BitMap */
for (i=0; i<pubscreen->BitMap.Depth; i++)
{
if ((supBitMap->Planes[i] = AllocRaster(1024,1024)) == NULL)
CloseAll();
}
/* Inizializza i campi dei gadgets */
InizializzaGadgets();
/* apre finestra spostabile, ridimensionabile, SuperBitMap, GimmeZeroZero,
con il gadget di chiusura */
if ((finestra = OpenWindowTags(NULL,WA_Left,10,
WA_Top,10,
WA_Width,350,
WA_Height,150,
WA_MaxWidth,1024,
WA_MaxHeight,1024,
WA_Title,"Mostra BitMap",
WA_DragBar,TRUE,
WA_CloseGadget,TRUE,
WA_DepthGadget,TRUE,
WA_SizeGadget,TRUE,
WA_SizeBRight,TRUE,
WA_SizeBBottom,TRUE,
WA_Flags,WFLG_SUPER_BITMAP|WFLG_GIMMEZEROZERO|WFLG_NOCAREREFRESH,
WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_GADGETDOWN|IDCMP_GADGETUP|IDCMP_NEWSIZE,
WA_Gadgets,&GadOriz,
WA_PubScreen,pubscreen,
WA_SuperBitMap,supBitMap,
TAG_END)) == NULL)
CloseAll();
UPort = finestra -> UserPort;
return;
}
/* Questa procedura inizializza i due gadgets proporzionali */
void InizializzaGadgets()
{
PropOrizInfo.Flags = AUTOKNOB|FREEHORIZ|PROPNEWLOOK;
PropOrizInfo.HorizPot = 0;
PropOrizInfo.VertPot = 0;
PropOrizInfo.HorizBody = MAXBODY;
PropOrizInfo.VertBody = MAXBODY;
GadOriz.NextGadget = &GadVert;
GadOriz.LeftEdge = 3; GadOriz.TopEdge = -7;
GadOriz.Width = -23; GadOriz.Height = 6;
GadOriz.Flags = GFLG_RELBOTTOM|GFLG_RELWIDTH;
GadOriz.Activation = GACT_RELVERIFY|GACT_IMMEDIATE|GACT_BOTTOMBORDER;
GadOriz.GadgetType = GTYP_PROPGADGET|GTYP_GZZGADGET;
GadOriz.GadgetRender = (APTR)&GadOrizImage;
GadOriz.SpecialInfo = (APTR)&PropOrizInfo;
GadOriz.GadgetID = ORIZGADGET;
PropVertInfo.Flags = AUTOKNOB|FREEVERT|PROPNEWLOOK;
PropVertInfo.HorizPot = 0;
PropVertInfo.VertPot = 0;
PropVertInfo.HorizBody = MAXBODY;
PropVertInfo.VertBody = MAXBODY;
GadVert.NextGadget = NULL;
GadVert.LeftEdge = -14; GadVert.TopEdge = pubscreen->WBorTop+pubscreen->Font->ta_YSize + 2;
GadVert.Width = 12; GadVert.Height = -GadVert.TopEdge - 11;
GadVert.Flags = GFLG_RELRIGHT|GFLG_RELHEIGHT;
GadVert.Activation = GACT_RELVERIFY|GACT_IMMEDIATE|GACT_RIGHTBORDER;
GadVert.GadgetType = GTYP_PROPGADGET|GTYP_GZZGADGET;
GadVert.GadgetRender = (APTR)&GadVertImage;
GadVert.SpecialInfo = (APTR)&PropVertInfo;
GadVert.GadgetID = VERTGADGET;
return;
}
/* Questa procedura disegna una serie di linee nella BitMap della finestra */
void DisegnaTutto()
{
register WORD x1,y1,x2,y2,penna,ncol,dx,dy;
ncol = 1 << pubscreen->BitMap.Depth;
dx = RangeRand(6)+2;
dy = RangeRand(6)+2;
penna = RangeRand(ncol-1)+1;
SetAPen(finestra->RPort,penna); /* imposta il colore da usare per il disegno */
x2 = 1023; y1 = 0; y2 = 1023;
for (x1=0; x1<1204; x1+=dx)
{
Move(finestra->RPort,x1,y1);
Draw(finestra->RPort,x2,y2); /* disegna la linea */
x2-=dx;
}
penna = RangeRand(ncol-1)+1;
SetAPen(finestra->RPort,penna);
x1 = 0; x2 = 1023; y2 = 1023;
for (y1=0; y1<1204; y1+=dy)
{
Move(finestra->RPort,x1,y1);
Draw(finestra->RPort,x2,y2);
y2-=dy;
}
return;
}
/* questa procedura adatta i dati dei gadgets al cambiamento di dimensione della
finestra */
void NewSize(px,py)
register LONG *px,*py;
{
register LONG pp;
pp = *px;
if (*px>(1024-finestra->GZZWidth)) *px = 1024-finestra->GZZWidth;
ScrollLayer(0,finestra->RPort->Layer,*px-pp,0);
pp = *py;
if (*py>(1024-finestra->GZZHeight)) *py = 1024-finestra->GZZHeight;
ScrollLayer(0,finestra->RPort->Layer,0,*py-pp);
NewModifyProp(&GadOriz,finestra,NULL,AUTOKNOB|FREEHORIZ,((*px)*MAXPOT)/(1024-finestra->GZZWidth),0,
(finestra->GZZWidth * MAXBODY)/1024,MAXBODY,1);
NewModifyProp(&GadVert,finestra,NULL,AUTOKNOB|FREEVERT,0,((*py)*MAXPOT)/(1024-finestra->GZZHeight),
MAXBODY,(finestra->GZZHeight * MAXBODY)/1024,1);
return;
}
/* muove la superbitmap in base ai valori dei pot dei gadgets proporzionali */
void MoveMap(ID,px,py)
register UWORD ID;
register LONG *px,*py;
{
register LONG pp;
switch (ID)
{
case ORIZGADGET:
pp = *px;
*px = (PropOrizInfo.HorizPot*(1024-finestra->GZZWidth))/MAXPOT;
ScrollLayer(0,finestra->RPort->Layer,*px-pp,0);
break;
case VERTGADGET:
pp = *py;
*py = (PropVertInfo.VertPot*(1024-finestra->GZZHeight))/MAXPOT;
ScrollLayer(0,finestra->RPort->Layer,0,*py-pp);
break;
}
return;
}
void main()
{
register LONG pp;
LONG px=0,py=0;
struct IntuiMessage mm;
register UWORD GadID = NESSUNGADGET;
OpenAll(); /* apre tutte le strutture dati */
NewSize(&px,&py);
SetDrMd(finestra->RPort,JAM1); /* cancella la BitMap */
SetAPen(finestra->RPort,0); RectFill(finestra->RPort,0,0,1023,1023);
DisegnaTutto(); /* disegna le linee */
/* sposta il layer nella posizione 0,0 */
pp = finestra->RPort->Layer->Scroll_X; /* determina la posizione X del layer */
ScrollLayer(0,finestra->RPort->Layer,-pp,0); /* sposta il layer di -X */
pp = finestra->RPort->Layer->Scroll_Y; /* stesso per Y */
ScrollLayer(0,finestra->RPort->Layer,0,-pp);
while(1)
{
WaitEvent(UPort,&mm); /* attende un evento */
if (mm.Class == IDCMP_CLOSEWINDOW) break; /* se gadget di chiusura esci */
else if (mm.Class == IDCMP_GADGETDOWN)
{
GadID = ((struct Gadget *)(mm.IAddress))->GadgetID;
}
else if (mm.Class == IDCMP_GADGETUP)
{
MoveMap(GadID,&px,&py);
GadID = NESSUNGADGET;
}
else if (mm.Class == IDCMP_NEWSIZE) /* l'utente ha cambiato dimensione, verificare la corretta posizione */
{
NewSize(&px,&py);
}
}
CloseAll(); /* chiudi tutto ed esci */
}